package ar.edu.nc4cr.loader;

import java.io.File;
import java.util.Enumeration;
import java.util.Hashtable;

public class FiltroDeArchivo implements java.io.FileFilter {
	private Hashtable<String,Object> filters;
    private String description = null;
	private String descriptionCompleta = null;
    private boolean usaExtensionesEnDescripcion = true;
	
    public FiltroDeArchivo() {
    	this.filters = new Hashtable<String, Object>();
        }
    
    public FiltroDeArchivo(String extension, String descripcion) {
    	this();
    	if(extension!=null) addExtension(extension);
     	if(description!=null) setDescription(description);	
    }

    public void addExtension(String extension) {
    	filters.put(extension.toLowerCase(), this);
    	descriptionCompleta = null;
    }

    public void setDescription(String description) {
    	this.description = description;
    	descriptionCompleta = null;
    }   

	
	public boolean accept(File archivo) {
		if (archivo != null){
		    if(archivo.isDirectory())
				return true;
		    String extension = this.getExtension(archivo);
		    if ((extension != null) && (filters.get(extension) != null))
		    	return true;
		}
		return false;
	}
	
	
	public String getDescription() {
		if(descriptionCompleta == null)
		    if(description == null || isExtensionListInDescription()) {
		    	descriptionCompleta = description==null ? "(" : description + " (";
		    	Enumeration extensions = filters.keys();
		    	if(extensions != null) {
		    		descriptionCompleta += "." + (String) extensions.nextElement();
		    		while (extensions.hasMoreElements())
		    			descriptionCompleta += ", ." + (String) extensions.nextElement();
				}
				descriptionCompleta += ")";
		    }else{
		    	descriptionCompleta = description;
		    }
		return descriptionCompleta;
	}

	
	private String getExtension(File archivo){
		if (archivo != null){
			String nombreArchivo = archivo.getName();
			int i = nombreArchivo.lastIndexOf('.');
		    if(i>0 && i<nombreArchivo.length()-1)
				return nombreArchivo.substring(i+1).toLowerCase();
		}
		return null;
	}

	
    public boolean isExtensionListInDescription() {
    	return usaExtensionesEnDescripcion;
    }
	
}
